home *** CD-ROM | disk | FTP | other *** search
- ;
- ; This program originally available on the Motorola DSP bulletin board.
- ; It is provided under a DISCLAMER OF WARRANTY available from
- ; Motorola DSP Operation, 6501 Wm. Cannon Drive W., Austin, Tx., 78735.
- ;
- ; Linear Table Lookup/Interpolation Routine for Function Generation
- ;
- ; Last Update 16 Apr 87 Version 1.1
- ;
- ; This program provides a fixed-point implementation of a table
- ; lookup/interpolation (of form given in TLI.HLP).
- ;
- ; The example will generate a 255 point sine wave by
- ; interpolating between the points of a 17 point sine wave.
- ;
- opt cex,mex
- page 132,66,0,10
-
- dataout equ $fffe ; output file
- deg equ 3.141592654/180.0 ;conversion from radians to degrees
-
- org x:$10
- ;
- ; Function points Y(i)=f(X(i)): Sine wave of magnitude 1/2
- ;
- bptbl ;breakpoint table for function
- dc @sin(0.0*deg)/2.0
- dc @sin(22.5*deg)/2.0
- dc @sin(45.0*deg)/2.0
- dc @sin(67.5*deg)/2.0
- dc @sin(90.0*deg)/2.0
- dc @sin(112.5*deg)/2.0
- dc @sin(135.0*deg)/2.0
- dc @sin(157.5*deg)/2.0
- dc @sin(180.0*deg)/2.0
- dc @sin(202.5*deg)/2.0
- dc @sin(225.5*deg)/2.0
- dc @sin(247.5*deg)/2.0
- dc @sin(270.0*deg)/2.0
- dc @sin(292.5*deg)/2.0
- dc @sin(315.0*deg)/2.0
- dc @sin(337.5*deg)/2.0
- dc @sin(360.0*deg)/2.0
-
- n equ 4 ;number of bits in X(i)
-
- org p:$100
- ;
- ; Start of program
- ;
- move #-1.0,a ;initial angle =0 degrees
- ; note: A will vary from -1.0 to 1.0 to represent an angle
- ; varying from 0.0 to 360.0
- move a,x:0 ;save it
- do #255,_esine ;do 255 steps
-
-
- ;
- ; table lookup/interpolation routine
- ;
- clr b #$80,x0 ;mask for sign flip
- add x0,a #>bptbl,x0 ;flip sgn bit, point to fcn tbl
- do #n,_es ;shift n bits into b
- lsl a ;to become the index into the
- rol b ;function breakpoint table
- _es
- add x0,b #0,a2 ;add base to ptr, make A positive
- lsr a b1,r0 ;make A a fraction, move ptr
- ; This produces 2**(n-1) (X-X(i))
- ; Which is equal to (X-X(i))/(X(i+1)-X(i))
- move a,x0 ;move A for later mul
- move x:(r0)+,b ;get Y(i)
- move x:(r0),a ;get Y(i+1)
- sub b,a ;find Y(i+1)-Y(i)
- move a,y0 ;move Y(i+1)-Y(i)
- macr y0,x0,b ;find Y(i)+(Y(i+1)-Y(i))*(X-X(i))/2**(n-1)
- ;
- ; end of routine
- ;
- move b,y:dataout ;output data
- move x:0,a ;get angle
- move #$01,x0 ;angle increment (fractional)
- add x0,a ;increase angle
- move a,x:0 ;save output
- _esine
- end
-